package lib

import (
	"database/sql"
	"encoding/json"
	"github.com/astaxie/beego/orm"
	"strconv"
)

type NullInt64 struct {
	sql.NullInt64
}

// MarshalJSON 序列化为JSON
func (t NullInt64) MarshalJSON() ([]byte, error) {
	if t.Valid {
	   return []byte(strconv.FormatInt(t.Int64,10)),nil
	}else{
		return []byte("null"),nil
	}
}

// UnmarshalJSON 反序列化为JSON
func (t *NullInt64) UnmarshalJSON(data []byte) error {
	var err error
	// 空值处理
	v := string(data)
	if len(v) ==0 || v == "" {
		t.Valid = false
	}else{
		t.Valid = true
		result ,er:= strconv.ParseInt(v,10,64)
		if er != nil {
			t.Valid = false
		}else{
			t.Int64  = result
		}
	}
	return err
}

func (t *NullInt64)SetValue(value int64)  {
	t.Valid = true
	t.Int64 = value
}

// String 重写String方法
func (t *NullInt64) String() string {
	data, _ := json.Marshal(t)
	return string(data)
}

// FieldType 数据类型
func (t *NullInt64) FieldType() int {
	return orm.TypeBigIntegerField

}

// SetRaw 读取数据库值
func (t *NullInt64) SetRaw(value interface{}) error {
	switch value.(type) {
	case int64:
		t.Int64 = value.(int64)
		t.Valid = true
	}
	return nil
}

// RawValue 写入数据库
func (t *NullInt64) RawValue() interface{} {
	if t.Valid {
		return t.Int64
	}else{
		return  nil
	}
}
